//////////////////////////////////////////////////////////////////////
//
// NO_IArchive.h header for the $1 class.
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#ifndef NO_IArchive_H
#define NO_IArchive_H

//////////////////////////////////////////////////////////////////////////
#include "NO_Includes.h"
#include "NO_IOABase.h"

//////////////////////////////////////////////////////////////////////////
// class NO_IArchive definition
//////////////////////////////////////////////////////////////////////////
class NO_DLL_TAL NO_IArchive : virtual public NO_IOABase 
{
public:	
	//////////////////////////////////////////////////////////////////////////
	// con/destruction
	//////////////////////////////////////////////////////////////////////////
	NO_IArchive(void);

	//////////////////////////////////////////////////////////////////////
	// use
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	virtual NO_IArchive& operator>> (NO_Object& object);

	//////////////////////////////////////////////////////////////////////
	virtual NO_IArchive& read(NO_Boolean& object) = 0;
	virtual NO_IArchive& read(NO_Int& object) = 0;
	virtual NO_IArchive& read(NO_Int8& object) = 0;
	virtual NO_IArchive& read(NO_UInt& object) = 0;
	virtual NO_IArchive& read(NO_UInt8& object) = 0;
	virtual NO_IArchive& read(NO_SInt8& object) = 0;
	virtual NO_IArchive& read(NO_UInt16& object) = 0;
	virtual NO_IArchive& read(NO_SInt16& object) = 0;
	virtual NO_IArchive& read(NO_UInt32& object) = 0;
	virtual NO_IArchive& read(NO_SInt32& object) = 0;
	virtual NO_IArchive& read(NO_UInt64& object) = 0;
	virtual NO_IArchive& read(NO_SInt64& object) = 0;
	virtual NO_IArchive& read(NO_Float32& object) = 0;
	virtual NO_IArchive& read(NO_Float64& object) = 0;
	virtual NO_IArchive& read(std::string& object) = 0;
	virtual NO_IArchive& read(const NO_Int8* object) = 0;
	virtual NO_IArchive& read(NO_Int8*& object) = 0;
	
	//////////////////////////////////////////////////////////////////////////
	NO_IArchive& objectBegin(NO_Object& object);
	NO_IArchive& objectEnd(NO_Object& object);

	//////////////////////////////////////////////////////////////////////////
	NO_IArchive& range(NO_Object& object);
	NO_IArchive& bases(NO_Object& object);
	NO_IArchive& members(NO_Object& object);

	//////////////////////////////////////////////////////////////////////////
	void		peekBegin	(void);
	NO_Object	restore		(void);
	NO_Boolean	verify		(NO_Object&);

protected:
	//////////////////////////////////////////////////////////////////////////
	virtual NO_IArchive& readBegin	(void) = 0;
	virtual NO_IArchive& readEnd	(void) = 0;
	
	//////////////////////////////////////////////////////////////////////////
	void setLastRead(NO_UInt32 t, NO_UInt32 p, NO_UInt32 n);	
	
private:
	//////////////////////////////////////////////////////////////////////////
	NO_IArchive& emptyBegin(NO_Object& object);
	NO_IArchive& emptyEnd(NO_Object& object);

	//////////////////////////////////////////////////////////////////////////
	NO_UInt32 typeID;
	NO_UInt32 ptrID;
	NO_UInt32 num;
	NO_Boolean pointerFound;
};

#endif 
